package util;

import java.sql.*;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBUtil {
	// 私有构造方法：禁止从外部创建此对象
	private static String url;
	private static String user;
	private static String password;
	private static String clsName;
	static {
		Properties p = new Properties();
		try {
			p.load(DBUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"));
			clsName = p.getProperty("driver");
			url = p.getProperty("url");
			user = p.getProperty("user");
			password = p.getProperty("pass");
			Class.forName(clsName);
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();

		}
	}

	private DBUtil() {
	}

	public static Connection getConnection() {
		Connection con = null;
		try {
			con = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return con;
	}

	// private static DataSource ds = getDs();
	//
	// private static DataSource getDs() {
	// try {
	// Context ic = new InitialContext();
	// return (DataSource) ic.lookup("java:comp/env/jdbc/school");
	//
	// } catch (NamingException e) {
	// // TODO 自动生成的 catch 块
	// e.printStackTrace();
	// }
	//
	// return null;
	// }

	// public static Connection getConnection() {
	// Connection con = null;
	// try {
	// con = ds.getConnection();
	// // System.out.println(con.getClass().getName());
	// } catch (SQLException e) {
	// // TODO 自动生成的 catch 块
	// e.printStackTrace();
	// }
	// return con;
	// }

	public static void close(ResultSet rs, Statement s, Connection con) {
		close(rs);
		close(s);
		close(con);
	}

	public static void close(ResultSet rs) {
		if (rs != null)
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
	}

	public static void close(Statement s) {
		if (s != null)
			try {
				s.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
	}

	// 入池
	public static void close(Connection con) {
		if (con != null)
			try {
				con.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
	}

	// 通用的CUD操作
	/**
	 * 
	 * @param sql语句
	 * @param 参数
	 * @return 影响的行数
	 */
	public static int executeUpdate(String sql, Object... args) {

		Connection con = DBUtil.getConnection();
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			return ps.executeUpdate();
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {
			close(ps);
			close(con);
		}

		return 0;
	}
}
